#include "shm.h"
#include <sys/ipc.h>
#include <sys/shm.h>

//初始化共享内存
void * shm_init()
{
    //创建或获取共享内存
    int shm_id=shmget(SHM_KEY,SHM_SIZE,IPC_CREAT|0666);
    if(shm_id<0)
    {
        exit(EXIT_FAILURE);
    }

    //映射共享内存到进程地址空间
    void* shm_addr=shmat(shm_id,NULL,0);
    if(shm_addr==(void*)-1)
    {
        exit(EXIT_FAILURE);
    }

    return shm_addr;
}

// 向共享内存写入数据
int shm_write_data(void* shm_addr, const char* json_str)
{
    if(!shm_addr||!json_str)
    {
        return -1;
    }
    size_t json_len = strlen(json_str);
    if(json_len >= SHM_SIZE)
    {
        printf("[shm_write_data] JSON字符串过长(%zu字节)超过共享内存大小（%d字节)\n",
               json_len, SHM_SIZE);
    }
    memcpy(shm_addr,json_str,json_len+1);
    return 0;
}

//读取共享内存数据
int shm_read(void* shm_addr,devdata* data)
{
    if(!shm_addr||!data)
    {
        return -1;
    }
    memcpy(data,shm_addr,SHM_SIZE);
    return 0;
}

//释放共享内存映射
void shm_destory(void* shm_addr)
{
    if(shm_addr)
    {
        shmdt(shm_addr);
    }
}